条件付きGET Request
clientやProxyではcacheをするが、TTLが切れた時にどうするか?という話
色々ある
table:_
versionを使って比較 最終更新日を使って比較
response header ETag Last-Modified
条件付きreqのheader(不一致で200/一致で304) If-None-Match If-Modified-Since
条件付きreqのheader(不一致で412/一致で200) If-Match If-Unmodified-Since
If-Range
Range Headerと併用する用の条件付きreqのheader
他の4つとはちょっとグループが異なるmrsekut.icon
clientやProxyではcacheをするが、TTLが切れた時にどうするか?という話
TTL切れてstaleなcacheになった際に、以下の2つの方針が取れる
cacheを破棄し、新しくOriginからデータを丸ごと再取得する
TTLは切れているが古くて役立たないのかどうかを、Originに問い合わせて確認する
条件付きGet Requestは後者に関する話である
有効期限が切れていても(stale)、内容が古くなっているとは限らない
もし古くなっていなかった場合、再取得するとその分のtrafficが無駄になる
内容が古くなっているかどうかを確認し、古くなっているなら再取得すれば良い
この「古くなっているかどうかをOriginに問い合わせるrequest」のことを条件付きGet Requestと呼ぶ
条件付きGet Requestを受け取ったserverは以下のような操作を行う
受け取ったrequestを読んで、そのresouceが古くなっているかどうかを検証する
検証した結果、
古くなっていなかったら、304 Not Modifiedを返す
resource自体は返さない
古くなっていたら、resouceを乗せて、200 OKで返す
serverはどうやって、resouceが古くなっているかどうかを検証するのか?
(条件付きGet Requestとして使われるかどうかに関わらず、事前に、)Server側がresouceの返却時に何かしらの比較するための値を含めておけば良い
比較する値(検証子)には2種類ある
resourceにversionを振って比較する
更新されるとversionも更新する
responseのETag headerにversionを付与しておく
resouceの最終更新日を比較する
responseのLast-Modified headerに最終更新日を付与しておく
これらのいずれかを使用すれば古くなっているかどうかの検証ができる
staleなcacheがある状態で、同じresourceをOriginから取得するためのrequestを送る際に、Browserは条件付きGet Requestを送る
条件付きRequestに、headerを指定することで、上の2つのどちらの検証子を使って検証するかを選択できる
ETagを使って検証したい場合は、If-None-Match headerを付与する
Last-Modifiedを使って検証したい場合は、If-Modified-Sinceを付与する
2つとも指定されて、serverも両者に対応している場合は、If-None-Matchが優先される
↑これは、説明のためにこう書いたが、
実際は「If-None-MatchやIf-Modified-Sinceを指定したheader」が「条件付きrequest」とみなされる
#??
serverがIf-None-Matchなどを解釈できない場合はどうなるの?
そんなことはほぼない?
参考
/mrsekut-book-4297119250/183
/mrsekut-book-4297119250/340
『ハイパフォーマンスWebサイト』 13章
https://blog.redbox.ne.jp/http-header-tuning.html